package com.sxbbc.common.basics.utils.statics;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 
 * 枚举类工具类
 * @author Wahyee
 */
public class EnumUtils {
	
	
	/** value对应的get方法名 */
	public static final String GET_ID = "getId";
	
	/**
	 * 
	 * 根据数组位置获取枚举类型
	 * 传入的参数i指的是需要的枚举值在设定的枚举类中的顺序，以0开始
	 * @param clazz 枚举类型
	 * @param i 序号
	 * @return
	 * @author Wahyee
	 */
	public static <T extends Enum<T>> T getEnum( Class<T> clazz, Integer i) {
		return (T) clazz.getEnumConstants()[i];
	}
	
    /** 
     * 使用枚举类型对应的value获取枚举类型 
     * T 
     * @param clazz    枚举类的class 
     * @param getValueMethodName  传入的value的get方法 
     * @param value  传入的value值，这个方法为String类型 
     * @return 
     */  
    public static <T extends Enum<T>> T getEnum(Class<T> clazz,String getValueMethodName, String value){  
        T result = null;  
        try{  
            T[] arr = clazz.getEnumConstants();  
            Method targetMethod = clazz.getDeclaredMethod(getValueMethodName);  
            String val = null;  
            for(T entity:arr){  
                val = targetMethod.invoke(entity).toString();  
                if(val.contentEquals(value)){  
                    result = entity;  
                    break;  
                }  
            }             
        } catch (IllegalAccessException e) {  
            e.printStackTrace();  
        } catch (IllegalArgumentException e) {  
            e.printStackTrace();  
        } catch (InvocationTargetException e) {  
            e.printStackTrace();  
        } catch (NoSuchMethodException e) {  
            e.printStackTrace();  
        } catch (SecurityException e) {  
            e.printStackTrace();  
        }  
        return result;  
    } 
	
    /** 
     * 使用枚举类型对应的value获取枚举类型 
     * T 
     * @param clazz    枚举类的类型 
     * @param getValueMethodName  传入的value的get方法 
     * @param value  传入的value值，这个方法为Integer类型 
     * @return 
     */  
    public static <T extends Enum<T>> T getEnum(Class<T> clazz,String getValueMethodName, Integer value){  
        T result = null;  
        try{  
            T[] arr = clazz.getEnumConstants();  
            Method targetMethod = clazz.getDeclaredMethod(getValueMethodName);  
            Integer val = null;  
            for(T entity:arr){  
                val = Integer.valueOf(targetMethod.invoke(entity).toString());  
                if(val.equals(value)){  
                    result = entity;  
                    break;  
                }  
            }             
        } catch (IllegalAccessException e) {
            e.printStackTrace();  
        } catch (IllegalArgumentException e) {
            e.printStackTrace();  
        } catch (InvocationTargetException e) {  
            e.printStackTrace();  
        } catch (NoSuchMethodException e) {  
            e.printStackTrace();  
        } catch (SecurityException e) {  
            e.printStackTrace();  
        }  
        return result;  
    }  
	
}
